# -*- coding: utf-8 -*-
from ...CLAPI import CLModuleProxy
from ...Config import KID_NEXT
lambda: "饰品客户端逻辑"

clProxy = CLModuleProxy.fromModPath(KID_NEXT, "Features.Accessories.Client")

@clProxy.bindTarget
class BaseAcceModifyHandler:
    """ 饰品属性处理器基类 需要实现文本渲染以及左右切换方法 """
    def __init__(self):
        pass

    def getRenderText(self):
        return "0"

    def left(self):
        pass

    def right(self):
        pass

@clProxy.bindTarget
class AcceModifyHandler(BaseAcceModifyHandler):
    """ 【推荐】通用饰品属性处理器, 基于query管理 """
    def __init__(self, bindQuery="", minValue=0, maxValue=10, length=1, formatStr="", formatEval=lambda v: v):
        """
            :param bindQuery: 绑定的query名称
            :param minValue: 最小值
            :param maxValue: 最大值
            :param length: 步长
            :param formatStr: 格式化字符串 若设置将会在显示时使用
            :param formatEval: 格式化函数 用于格式化显示的值
        """
        BaseAcceModifyHandler.__init__(self)
        self.index = 0
        self.bindQuery = bindQuery
        self.minValue = minValue
        self.maxValue = maxValue
        self.length = length
        self.formatEval = formatEval  # 用于格式化显示的函数
        self.keyName = ""
        self.typeName = ""
        self.formatStr = formatStr

@clProxy.bindTarget
class AcceBinder:
    """ 饰品绑定器, 用于绑定饰品的属性 """
    def __init__(self, keyName="default", bindValue=1, icon="", handlerList=[], customTypeName=""):
        # type: (str, int, str, list[AcceModifyHandler], str) -> None
        """
        :param keyName: 绑定的名称
        :param bindValue: 绑定的值
        :param icon: 图标路径
        :param handlerList: 绑定的修改处理器列表
        :param customTypeName: 自定义的类型名称(若不设置则跟随组级类别)
        """
        self.keyName = keyName
        self.bindValue = bindValue
        self.typeName = customTypeName
        self.bindQuery = ""
        self.icon = icon
        self.loadQueryMap = {}  # type: dict[str, int]
        self.handlerList = handlerList[::]

    def onInit(self):
        for i, handler in enumerate(self.handlerList):
            handler.keyName = self.keyName
            handler.typeName = self.typeName
            handler.index = i

    def getIcon(self):
        # type: () -> str
        return self.icon
    
    def getAcceModifyHandlers(self):
        return self.handlerList

    def onClick(self):
        pass

    def getRenderState(self):
        pass

    def loadRes(self):
        # 资源加载方法 默认基于query值处理
        pass

    def unLoadRes(self):
        # 资源卸载方法 默认基于query值处理
        pass

@clProxy.bindTarget
class AccessoriesGroups:
    """ 饰品组, 用于管理一组饰品(化分UI行以及存档map层) """
    def __init__(self, title="Unknow", typeName="default", bindQuery="query.mod.test", childs=[]):
        # type: (str, str, str, list[AcceBinder]) -> None
        self.typeName = typeName
        self.title = title
        self.bindQuery = bindQuery
        self.childs = childs
    
    def createRenderObjs(self):
        pass

    def addChild(self, child):
        # type: (AcceBinder) -> None
        pass

@clProxy.bindTarget
def GET_BUILTINS_TYPE_GROUP(typeName):
    # type: (str) -> AccessoriesGroups | None
    """ 根据类型名称获取内建饰品组，如果不存在则返回None
        内建饰品类型表(不承诺不变更, 需另外判断None值):
        - eye: 眼睛
        - face: 面部/面具
        - head: 头部/头饰
        - shoulder: 玩偶
        - wings: 翅膀
        - tail: 尾巴
        - shoes: 鞋子
    """
    # 对于内置饰品组注册扩展需要确保在AddonFinish之前完成, 自定义组则不需要
    return AccessoriesGroups()

@clProxy.bindTarget
def REG_ACCESSORIES_GROUP(group):
    # type: (AccessoriesGroups) -> None
    """ 注册一个饰品组, 该组将会在饰品组列表中显示 """
    # 注意: 该方法需要在OnLocalPlayerStopLoading之前调用, 否则存档数据加载将会失败(找不到注册信息)
    pass

"""
注册自定义类别:
# 需要确保唯一的类型分组, 每个组类别都有唯一的query绑定(除非重写实现)

myGroup = AccessoriesGroups("自定义饰品类", "custom_type", bindQuery="query.mod.custom_type", childs=[
    AcceBinder("item1", 1, "textures/xxx/icon", "query.mod.bind_set1", handlerList=[]),
    # handlerList允许定义至多9个可变属性提供给玩家切换
    AcceBinder("item2", 2, "textures/xxx/icon", "query.mod.bind_set2", handlerList=[
        # AcceModifyHandler提供了最小，最大，以及步长的属性设置，同时支持格式化显示，也可以定义lambda控制显示的数值偏移量/其他表现形式
        AcceModifyHandler("query.mod.custom_type.item1", 0, 10, 1, "属性值: {}", lambda v: v+0),
        ...
    ]),
    # 由于同一个类别的饰品通常不会被同时加载，因此推荐共用query名（存档是独立的）
])

REG_ACCESSORIES_GROUP(myGroup)  # 注册自定义饰品组(一旦完成注册不再允许增量)

修改/扩展内置饰品组:
# 需要确保在AddonFinish之前完成注册, 否则无法增量处理数据结构

headGroup = GET_BUILTINS_TYPE_GROUP("head")
if not headGroup:
    return  # 不存在该组, 无法扩展
headGroup.addChild(AcceBinder(...))
"""